package bo;

import dao.dto.AdresseDto;
import dao.dto.CodePostalDto;
import boerrors.CodePostalMinimumMultiplicityException;
import boerrors.ZoneMinimumMultiplicityException;
import IBO.IAdresse;
import IBO.ICodePostal;
import boerrors.AdresseInexistantException;
import dao.AbstractFactory;
import dao.dto.ZoneDto;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import util.Util;

public class Adresse implements IAdresse, Cloneable {
        private int _idAdresse;
	private String _rue;
	private String _numero;
        private CodePostal _codePostal;
        
	//*******************************************************************
	//Constructeurs
	//*******************************************************************
        
        public Adresse(AdresseDto adresseDto) throws RemoteException {
                CodePostal tampon = new CodePostal(adresseDto.getCodePostal());
                setIdAdresse(adresseDto.getIdAdresse());
                setRue(adresseDto.getRue());
                setNumero(adresseDto.getNumero());
                enregistrerCodePostal(tampon);
                UnicastRemoteObject.exportObject(this,0);
        }
        
	public Adresse(int idAdresse, String rue, String numero, CodePostal codePostal) throws RemoteException {
                setIdAdresse(idAdresse);
		setRue(rue);
                setNumero(numero);                
		enregistrerCodePostal(codePostal);
                UnicastRemoteObject.exportObject(this,0);
	}
               
        public Adresse(String rue, String numero, CodePostal codePostal) throws RemoteException{
		setRue(rue);
                setNumero(numero);                
		enregistrerCodePostal(codePostal);
                UnicastRemoteObject.exportObject(this,0);
        }

        //*******************************************************************
        //Convertir bo - dto
     	//*******************************************************************
        
        public AdresseDto creerAdresseDto() throws  CodePostalMinimumMultiplicityException,  
                                                    ZoneMinimumMultiplicityException,
                                                    RemoteException {
                ZoneDto zoneTampon = new ZoneDto(   this.getCodePostal().getZone().getIdZone(), 
                                                    this.getCodePostal().getZone().getLibelleZone());
                CodePostalDto codePostalTampon = new CodePostalDto( this.getCodePostal().getIdCodePostal(), 
                                                                    this.getCodePostal().getCodePostal(),
                                                                    this.getCodePostal().getVille(), 
                                                                    this.getCodePostal().getPays(),zoneTampon);
                return new AdresseDto(this.getIdAdresse(), this.getRue(), this.getNumero(), codePostalTampon);
        }
    
	//*******************************************************************
	//Setters
	//*******************************************************************
        
        public synchronized void setIdAdresse(int idAdresse) {
		Util.checkPositive(idAdresse);
                this._idAdresse = idAdresse;
	}
	
        public synchronized void setRue(String rue) {
		Util.checkString(rue);
                this._rue = rue;
	}
	
        public synchronized void setNumero(String numero) {
		Util.checkString(numero);
                this._numero = numero;
	}
	               
	//*******************************************************************
	//Getters
	//*******************************************************************
	
        public synchronized int getIdAdresse()throws RemoteException {
		return _idAdresse;
	}
	
        public synchronized String getRue() throws RemoteException {
		return _rue;
	}

        public synchronized String getNumero() throws RemoteException {
		return _numero;
	}
        
        public synchronized CodePostal getCodePostal()throws RemoteException, CodePostalMinimumMultiplicityException {
                if (!aUnCodePostalValide()) throw new CodePostalMinimumMultiplicityException();
        return _codePostal;
        }
        
        public synchronized ICodePostal getICodePostal() throws RemoteException, CodePostalMinimumMultiplicityException {
                if (!aUnCodePostalValide()) throw new CodePostalMinimumMultiplicityException();
        return (ICodePostal)this._codePostal;
        }
        
	//*******************************************************************
	//Associations
	//*******************************************************************
        
        public boolean enregistrerCodePostal(CodePostal CodePostal){
                if (CodePostal == null) return false;
                if (this._codePostal == CodePostal) return false;
                if (!peutEnregistrerCodePostal()) return false;
                this._codePostal=CodePostal;
                return true;
        }
        //clone modifier code postal pour une adresse client
        public boolean enregistrerCodePostalClone(CodePostal CodePostal){
                if (CodePostal == null) return false;
                if (this._codePostal == CodePostal) return false;
                if (peutEnregistrerCodePostal()) return false;
                this._codePostal=CodePostal;
                return true;
        }
    
        //Aucune suppression du code postal n'est autorisee
                
        public boolean peutEnregistrerCodePostal(){
                return this._codePostal == null;
        }
    
        public boolean aUnCodePostalValide(){
                return this._codePostal != null;
        }
        
	//*******************************************************************
	//Méthodes static
	//*******************************************************************
        
        public static void creerIAdresse(){
            System.out.println("CreerIAdresse OK");
        }
        
        public synchronized static Adresse selectId(int idAdresse) throws RemoteException, AdresseInexistantException {
                AdresseDto adrDto = AbstractFactory.getInstance().getAdresseDao().selectId(idAdresse);               
                Zone zone = new Zone(   adrDto.getCodePostal().getZone().getIdZone(),
                                        adrDto.getCodePostal().getZone().getLibelleZone());
                CodePostal cp = new CodePostal( adrDto.getCodePostal().getIdCodePostal(),
                                                adrDto.getCodePostal().getCodePostal(),
                                                adrDto.getCodePostal().getVille(),
                                                adrDto.getCodePostal().getPays(), zone);            
                Adresse adr= new Adresse(adrDto.getIdAdresse(),adrDto.getRue(),adrDto.getNumero(),cp);
                return adr;
        }
        
        public synchronized static Vector<Adresse> listerAdresseParClient(int idClient) throws   Exception, AdresseInexistantException {
                Vector<AdresseDto>listeDto = new Vector<AdresseDto>();
                Vector<Adresse>listeBo = new Vector<Adresse>();
                listeDto = AbstractFactory.getInstance().getAdresseDao().listerParClient(idClient);
                for(int i = 0 ; i < listeDto.size() ; i++){
                    
                        Zone zone = new Zone(   ((AdresseDto)listeDto.get(i)).getCodePostal().getZone().getIdZone(),
                                                ((AdresseDto)listeDto.get(i)).getCodePostal().getZone().getLibelleZone());
                        CodePostal codePostal = new CodePostal( ((AdresseDto)listeDto.get(i)).getCodePostal().getIdCodePostal(),
                                                                ((AdresseDto)listeDto.get(i)).getCodePostal().getCodePostal(),
                                                                ((AdresseDto)listeDto.get(i)).getCodePostal().getVille(),
                                                                ((AdresseDto)listeDto.get(i)).getCodePostal().getPays()
                                                                , zone);
                        
                        Adresse adr= new Adresse( ((AdresseDto)listeDto.get(i)).getIdAdresse()
                                                    ,((AdresseDto)listeDto.get(i)).getRue()
                                                    ,((AdresseDto)listeDto.get(i)).getNumero()
                                                    , codePostal);
                        listeBo.add(adr);
                }
                return listeBo;
        }       

        //*******************************************************************
	//Method Clonable
	//*******************************************************************        
        
        @Override
        public Object clone(){
            Adresse adresse = null;
            try {
                adresse = (Adresse) super.clone();
                adresse._codePostal = (CodePostal) _codePostal.clone();
            } catch (CloneNotSupportedException ex) {
                Logger.getLogger(Adresse.class.getName()).log(Level.SEVERE, null, ex);
            }
            return adresse;
        }        
}